//package com.example.financeapi.utils.pay;
//
//import cn.hutool.crypto.SecureUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.http.HttpEntity;
//import org.apache.http.client.methods.CloseableHttpResponse;
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
//import org.apache.http.conn.ssl.SSLContexts;
//import org.apache.http.entity.StringEntity;
//import org.apache.http.impl.client.CloseableHttpClient;
//import org.apache.http.impl.client.HttpClients;
//import org.apache.http.util.EntityUtils;
//import org.springframework.boot.context.properties.EnableConfigurationProperties;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.stereotype.Component;
//
//import javax.net.ssl.SSLContext;
//import java.io.InputStream;
//import java.security.KeyStore;
//import java.util.Iterator;
//import java.util.Map;
//import java.util.Set;
//import java.util.SortedMap;
//
///**
// * 相关配置参数
// */
//@Slf4j
//@Component
//@Configuration
//@EnableConfigurationProperties({WxPayProperties.class})
//public class WxPayUtil {
//
//    private WxPayProperties wxPayProperties;
//
//    public WxPayUtil(WxPayProperties wxPayProperties) {
//        this.wxPayProperties = wxPayProperties;
//    }
//
//    public WxPayProperties wxPayProperties() {
//        return wxPayProperties;
//    }
//
///*	public void commonParams(SortedMap<Object, Object> packageParams) {
//		String appId = wxPayProperties.getAppId();
//		String mch_id = wxPayProperties.getMchId();
//		String currTime = PayCommonUtil.getCurrTime();
//		String strTime = currTime.substring(8);
//		String strRandom = PayCommonUtil.buildRandom(4) + "";
//		String nonce_str = strTime + strRandom;
//		packageParams.put("appid", appId);
//		packageParams.put("mch_id", mch_id);
//		packageParams.put("nonce_str", nonce_str);
//	}*/
//
//
//
//    public  String doRefund(String url, String data) throws Exception {
//        /**
//         * PKCS12证书 是从微信商户平台-》账户设置-》 API安全 中下载的
//         */
//        KeyStore keyStore  = KeyStore.getInstance("PKCS12");
//        InputStream instream = WxPayUtil.class.getClassLoader().getResourceAsStream(wxPayProperties().getCertName());
//        if(instream == null) {
//            log.error("证书未找到，请保证项目根目录下存在名为【{}】的证书文件",wxPayProperties.getCertName());
//        }
//
//        //File certfile = ResourceUtils.getFile("classpath:cert"+
//        //Constants.SF_FILE_SEPARATOR + wxPay.getCertPath());
//        //FileInputStream instream = new FileInputStream(certfile);
//
//        try {
//            keyStore.load(instream, wxPayProperties.getMchId().toCharArray());
//        } finally {
//            instream.close();
//        }
//        SSLContext sslcontext = SSLContexts.custom()
//                .loadKeyMaterial(keyStore, wxPayProperties.getMchId().toCharArray())
//                .build();
//        SSLConnectionSocketFactory SSL = new SSLConnectionSocketFactory(
//                sslcontext,
//                new String[] { "TLSv1" },
//                null,
//                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
//        CloseableHttpClient httpclient = HttpClients.custom()
//                .setSSLSocketFactory(SSL)
//                .build();
//        try {
//            HttpPost httPost = new HttpPost(url);
//            httPost.setEntity(new StringEntity(data, "UTF-8"));
//            CloseableHttpResponse response = httpclient.execute(httPost);
//            try {
//                HttpEntity entity = response.getEntity();
//                String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
//                EntityUtils.consume(entity);
//                return jsonStr;
//            } finally {
//                response.close();
//            }
//        } finally {
//            httpclient.close();
//        }
//    }
//
//    /**
//     * 使用java正则表达式去掉多余的.与0
//     * @param s
//     * @return
//     */
//    public static String subZeroAndDot(String s) {
//        if (s.indexOf(".") > 0) {
//            s = s.replaceAll("0+?$", "");// 去掉多余的0
//            s = s.replaceAll("[.]$", "");// 如最后一位是.则去掉
//        }
//        return s;
//    }
//
//    /**
//     * sign签名
//     * @param characterEncoding
//     * @param packageParams
//     * @param API_KEY
//     * @return
//     */
//    public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {
//        StringBuffer sb = new StringBuffer();
//        Set es = packageParams.entrySet();
//        Iterator it = es.iterator();
//        while (it.hasNext()) {
//            Map.Entry entry = (Map.Entry) it.next();
//            String k = (String) entry.getKey();
//            String v = (String) entry.getValue();
//            if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
//                sb.append(k + "=" + v + "&");
//            }
//        }
//        sb.append("key=" + API_KEY);
//        String sign = SecureUtil.md5(sb.toString()).toUpperCase();
//        return sign;
//    }
//
//    /**
//     * 微信退款
//     *
//     * @param orderId
//     * @return
//     * @throws Exception
//     */
//    public Result wxRefund(Long orderId) throws Exception {
//
//        // 校验订单信息
//        Order order = orderService.findOne(orderId);
//        if (order.getStatus() != OrderStatus.CREATE.getStatus()) {
//            log.error(ExceptionMessage.ORDER_STATUS_INCORRECTNESS + " orderId: {}", orderId);
//            throw new ValidateException(ExceptionMessage.ORDER_STATUS_INCORRECTNESS);
//        }
//
//        String nonceStr = RandomUtil.randomStr(15);
//        String out_refund_no = RandomUtil.randomStr(15);
//
//        SortedMap<String, Object> params = new TreeMap<>();
//        // 公众账号ID
//        params.put("appid", appProperties.getWx().getApp_id());
//        // 商户号
//        params.put("mch_id", appProperties.getWx().getMch_id());
//        // 随机字符串
//        params.put("nonce_str", nonceStr);
//        // 商户订单号
//        params.put("out_trade_no", order.getOutTradeNo());
//        // 订单金额
//        params.put("total_fee", order.getTotalFee().toString());
//        // 商户退款单号
//        params.put("out_refund_no", out_refund_no);
//        // 退款原因
//        params.put("refund_fee", order.getTotalFee().toString());
//        // 退款结果通知url
//        params.put("notify_url", appProperties.getWx().getRefund_notify_url());
//        // 签名
//        params.put("sign", PaymentUtils.sign(params, appProperties.getWx().getApi_key()));
//        String data = PaymentUtils.mapToXml(params);
//
//        // 微信退款需要证书
//        CloseableHttpClient httpClient = HttpUtil.sslHttpsClient(appProperties.getWx().getCertificate_path(),
//                appProperties.getWx().getApi_key());
//
//        // 向微信发起退款
//        String responseXml = HttpUtil.sendSslXmlPost(appProperties.getWx().getRefund_url(), data, null, httpClient);
//
//        Map<String, String> responseMap = PaymentUtils.xmlToMap(responseXml);
//        Assert.notNull(responseMap, ExceptionMessage.XML_DATA_INCORRECTNESS.getMessage());
//        // return_code为微信返回的状态码，SUCCESS表示申请退款成功，return_msg 如非空，为错误原因 签名失败 参数格式校验错误
//        if ("SUCCESS".equalsIgnoreCase(responseMap.get("return_code"))) {
//            log.info("wx refund success response:{}", responseMap);
//            // 修改订单状态为退款保存退款订单等操作
//            return Result.error(ExceptionMessage.SUCCESS);
//        }
//        log.error("wx refund error response:{}", responseMap);
//        return Result.error(ExceptionMessage.WX_REFUND_FAILED);
//    }
//}